from django.shortcuts import render
from django.views import View
from django_redis import get_redis_connection
from django.http import JsonResponse, HttpResponse
from ihome.libs.captcha.captcha import captcha
from celery_tasks.sms.tasks import ccp_send_sms_code

import json, re,random


# Create your views here.



# 图片验证码
class ImageCodeView(View):
    def get(self, request):
        # 1.提取参数
        # data = json.loads(request.body.decode())
        cur = request.GET.get('cur')
        pre = request.GET.get('pre')
        # 2.校验参数
        # 2.1必要性校验
        if not cur:
            return JsonResponse({'errno': 4103, 'errmsg': '参数错误'})

        # 3.业务数据处理-生成图片验证码。存入redis２号库
        # 3.1 生成图片验证码
        text, image = captcha.generate_captcha()
        # print(text, image)
        # 3.2验证码text存入redis(以 cur作为key）
        # set img_<cur> <text>
        # 获取缓存项“verify_code‘
        try:
            conn = get_redis_connection('verify_code')
            # 存入图片验证码，设置有效期为３００秒
            conn.setex('img_%s' % cur, 300, text)

        except Exception as e:
            return JsonResponse({
                'errno': 4001, 'errmsg': '保存图形验证码错误'
            })

        # 4.构建响应
        return HttpResponse(image, content_type='image/jpeg')



# 短信验证码
class SmsCodeView(View):
    def post(self, request):
        # 1.提取参数
        data = json.loads(request.body.decode())
        mobile = data.get('mobile')
        id = data.get('id')
        text = data.get('text')

        # 2.校验参数
        if not all([mobile, id, text]):
            return JsonResponse({'errno': 4003, 'errmsg': '缺少必要参数'})

        if not re.match(r'^1[3-9]\d{9}$', mobile):
            return JsonResponse({'errno': 4103, 'errmsg': '手机号有误'})

        conn = get_redis_connection('verify_code')

        # 3.业务数据处理-图形验证码正确，发送短信
        # 3.1获取redis图形验证码
        redis_code = conn.get('img_%s' % id)

        #删除图形验证码，只使用一次
        conn.delete('img_%s'%id)

        # 验证码是否过期
        if not redis_code:
            return JsonResponse({'errno': 4001, 'errmsg': '图形验证码过期'})

        #比较图形验证码　和　redis数据库是否相同,不区分大小写
        if text.lower() != redis_code.decode().lower():
            return JsonResponse({'errno':4004,'errmsg':'图形验证码错误'})

        # 给手机号做标记，避免频繁发送短信
        send_flag = conn.get('send_flag_%s' % mobile)
        if send_flag:
            return JsonResponse({'errno': 4201, 'errmsg': '请勿频繁发送短信'})

        #生成短信验证码，发送短信
        sms_code = '%06d' % random.randint(0,999999)
        p = conn.pipeline()
        p.setex('sms_code_%s'%mobile, 300, sms_code)
        p.setex('send_flag_%s'%mobile, 60 , 1)
        p.execute()

        #发送短信-异步发送
        ccp_send_sms_code(mobile, sms_code)
        print('短信验证码:', sms_code)

        # 4.构建响应
        return JsonResponse({'errno':0,'errmsg':'短信验证码发送成功'})
